<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="tr" xml:lang="tr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" href="../rurple.css" type="text/css" />

<title>Uygulama - bölüm 5</title>
</head>
<body>
<h2 class="title">21. Uygulama - bölüm 5</h2>

<h3 class="section">Daha karmaşık durumlar</h3>

<p>Aşağıdaki şekilde bir dünya ile karşılaşırsanız: </p>

<p><img alt="around the world: start" src=
"../../images/intro/around4start.png" /></p>

<p>Bir önceki derste yazdığınız program çalışır mı? Deneyin!</p>

<p>Sizin de tahmin ettiğiniz gibi, çalışmıyor. Çalışması için
<span class="pykeyword">if</span>'i <span class=
"pykeyword">while </span>ile değiştirmeniz gerekir. Deneyin ve programı 
kaydedin.</p>

<!--=====================================-->
<hr class="line" />

<h3 class="section">Amacımız nedir</h3>

<p>Karşılaşabileceğimiz her türlü durumda çalışabilecek bir program oluşturuldu. 
Bu program Reeborg'un herhangi bir dünyasında bir tur atmasını sağlar. Program 
kısa ve temiz bir yapıya sahip olmasına rağmen, bunu ilk kez gören birisi için 
kolay anlaşılır olmayabilir.  Bu programa açıklamalar 
eklemek anlaşılmasını kolaylaştıracaktır.</p>

<pre>
<span class="comment"># sağa dönmek için bir tanımlama yapıyoruz.</span>
<span class="keyword">def</span> turn_right():
    repeat(turn_left, 3)

<span class=
"comment"># başlangıç noktasını bir bip koyarak işaretliyoruz.</span>
put_beeper()

<span class=
"comment"># Önün boş olduğunu kontrol edip harekete başlıyoruz.</span>
<span class="keyword">while not</span> front_is_clear():
    turn_left()
move()

<span class="comment"># işaret olarak bıraktığımız bip'e ulaştığımızda</span>
<span class="comment"># turun tamamlandığını anlıyoruz.</span>

<span class="keyword">while not</span> next_to_a_beeper():
    <span class="keyword">if</span> right_is_clear(): <span class=
"comment"># sağı kontrol et</span>
        turn_right()
        move()
    <span class="keyword">elif</span> front_is_clear(): <span class=
"comment"># ön boş mu</span>
        move()
    <span class="keyword">else</span>:<span class=
"comment"> # sola dön </span>
        turn_left()

turn_off()
</pre>

<p>Bu açıklamalar komutlar yardımıyla ne yaptığımızı açıklamasına rağmen 
problemin çözümünde kullanılan metodun (algoritmanın) açıklanmasını sağlamaz. Bu 
nedenle bu açıklamalar bu programı okuyan başka bir kişiye umduğumuz kadar 
yardımcı olmayabilir. Programımız iki kısımdan oluşuyor: </p>

<ol>
<li>başlangıç noktasını işaretle. </li>
<li>sağdaki duvarı başlangıç noktasına gelinceye kadar takip et. </li>
</ol>

<p>Açıklamaları daha farklı yazarak bu iki kısmı daha açıkça ifade edecek şekilde 
programı yeniden yazalım. </p>

<pre>
<span class=
"comment"># Bu program Reeborg'a dünyasının etrafında bir tur attırır. </span>
<span class="comment"># saat yönünün zıttında ve başlangıç noktasına geldiğinde</span>
<span class="comment">#  durmasını sağlayarak. </span>

<span class="keyword">def</span> turn_right():
    repeat(turn_left, 3)

<span class="keyword">def</span> mark_starting_point_and_move():
    put_beeper()
    <span class="keyword">while not</span> front_is_clear():
        turn_left()
    move()

<span class="keyword">def</span> follow_right_wall():
    <span class="keyword">if</span> right_is_clear(): 
        turn_right()
        move()
    <span class="keyword">elif</span> front_is_clear(): 
        move()
    <span class="keyword">else</span>: 
        turn_left()

found_starting_point = next_to_a_beeper   <span class=
"comment"># bip başlangıç noktasını işaret eder.</span>

<span class="comment">#=== Tanımlamaların sonu; çözüm başlıyor</span>

mark_starting_point_and_move()
            
<span class="keyword">while not</span> found_starting_point(): 
    follow_right_wall()
      
turn_off()
</pre>

<p>Bu program daha anlaşılır değil mi? Şimdi programımızı çalıştırdığımızda her 
köşede bir bip olduğunu varsayalım. Bu durumda başlangıç noktamızı bir bip'i 
yerinden alarak belirleyebilirdik. Tanımlamalarda ufak değişiklikler yapmamız 
da gerekirdi ama bulmuş olduğumuz çözümü değiştirmeye gerek kalmazdı. </p>

<!--======================================-->
<hr class="line" />

<h3 class="try">İlk Sürpriz</h3>

<p>Yukarıdaki programdan  <tt>put_beeper()</tt>
komutunu kaldırın, kaydedin ve bu programı aşağıdaki engelli koşuda deneyin. (dosya: hurdles3.wld).</p>

<p><img alt="hurdles" src="../../images/intro/hurdles3_start.png" /></p>

<p>Sürpriz! Bu program engelli koşu problemini çözüyor, tek sıra dışı durum 
yarışma tamamlandığında Reeborg'un yüzünün farklı bir yöne dönük olması (belki 
yarışmayı tamamladıktan sonra seyircileri selamlıyordur!) . Bu program aşağıda 
olduğu gibi birbiriyle eşit olmayan engellerle de çalışır  (dosya: hurdles4.wld). 
Daha önceden engelli koşu için yazmış olduğumuz programın aşağıdaki durumda 
çalışmayacağı göz önüne alınırsa oldukça iyi bir iş ortaya çıkarttığımızı 
söyleyebiliriz. </p>

<p><img alt="hurdles" src="../../images/intro/hurdles4_start.png" /></p>

<!--======================================-->
<hr class="line" />

<h3 class="try">Şaşırtıcı sürpriz</h3>

<p>Az önceki programı ilk derslerde bahsettiğimiz labirent problemine uygulayın (dosya: maze1.wld).</p>

<p><img alt="maze" src="../../images/intro/maze1_start.png" /></p>

<p>Göreceğiniz gibi program labirentin çıkışını da bulabiliyor, şaşırtıcı değil 
mi.</p>

<!--======================================-->
<hr class="line" />

<h3 class="section">Sonuç</h3>

<p>Basit bir problemin çözümüyle başladık (dikdörtgen bir dünyanın etrafında bir 
tur atmak) ve bu programı adım adım geliştirerek, görünüşte birbirinden farklı 
durumlar içeren problemlere çözüm getirdik. Her adımda küçük değişiklikler 
yaptık, karmaşık problemlere başlamadan önce, programımızın değişikliklerden 
sonra hala çalışıyor olduğundan emin olduk. Bunun yanında algoritmanın daha iyi 
anlaşılabilmesini ve programın daha kolay okunabilir hale gelmesini sağlamak 
için açıklamalar ve açıklayıcı isimler kullandık. Kendi programlarınızı 
yazarken sizde böyle bir strateji uygulayın. </p>

<dl>
<dt><b>Kural # 5</b></dt>
<dd><b>Bir program yazarken takip edilecek adımlar:</b></dd>
</dl>

<ol>
<li>basit başla;</li>
<li>Küçük değişiklikleri bir defada bir tane olacak şekilde ekle; </li>
<li>yaptığın değişikliklerin programının çalışmasını bozmadığından emin ol;</li>
<li>her komutun ne iş yaptığını tekrarlamayan, uygun açıklamalarla yaz. ; ve</li>
<li>açıklayıcı adlar seç.</li>
</ol>

<div class="lessons_nav">
<a href="20-amazing4.htm"><img alt="previous" src=
"../../images/previous.png" /> Uygulama - bölüm 4</a> - <a href=
"../lessons_toc.htm"><img alt="home" src="../../images/home.png" /></a> - 
<a href="22-rain.htm">Yağmur Yağıyor! <img alt="next" src=
"../../images/next.png" /></a>
</div>
</body>
</html>

